package com.project;

import java.util.*;
import java.io.Serializable;

import static java.lang.Math.random;

/**
 *
 */
public class User extends ABT_System implements Serializable {

    /**
     * Default constructor
     */
    public User() {
        super();
    }

    /**
     * @return 返回
     */
    private boolean checkUser() {
        return logFlag != 2;
    }

    /**
     * @param input 输入
     * @return 返回
     */
    public boolean Information_Modification(List<String> input) { //个人信息修改
        if (input == null || input.isEmpty()) {
            System.err.println("输入数据不能为空");
            return false;
        }
        if (checkUser()) return false;
        // 仅做数据检查
        return input.size() == 7; // 确保参数数量正确
    }

    /**
     * @param input 输入
     * @return 返回
     */
    public boolean Pay(List<String> input) { // 支付
        if (input == null || input.size() < 4) {
            System.err.println("输入数据不完整，支付需要至少 4 个参数");
            return false;
        }
        if (checkUser()) return false;
        try {
            DB_Operator orderDB = Creat_DBOP("Order");
            List<String> params = new ArrayList<>();
            params.add(input.getFirst());
            params.add("" + uid);
            params.add(input.get(1));
            params.add(input.get(2));
            params.add(input.get(3));
            return orderDB.update(params);
        } catch (ABT_SystemException e) {
            System.err.println("出现异常：" + e.getMessage());
            return false;
        }
    }

    /**
     * @param input 输入
     * @return 返回
     */
    public List<String> Historical_orders(List<String> input) { //历史订单管理
        if (input == null) {
            input = new ArrayList<>();
        }
        if (checkUser()) return null;
        try {
            DB_Operator orderDB = Creat_DBOP("Order");
            List<String> params = new ArrayList<>();
            params.add("uid=" + uid);
            params.addAll(input);
            return orderDB.find(params);
        } catch (ABT_SystemException e) {
            return null;
        }
    }

    /**
     * @param input 输入
     * @return 返回
     */
    public boolean Book_ticket(List<String> input) { //预定机票
        if (input == null || input.size() < 2) {
            System.err.println("输入数据不完整，预定机票需要至少 2 个参数");
            return false;
        }
        if (checkUser()) return false;
        try {
            // input格式：["fid=123", "position=Economy"]
            DB_Operator airlineDB = Creat_DBOP("Airline");
            DB_Operator orderDB = Creat_DBOP("Order");
            DB_Operator ticketDB = Creat_DBOP("Ticket");

            // 解析输入参数
            String fid = input.get(0).split("=")[1];
            String position = input.get(1).split("=")[1];

            // 检查余票（原子操作）
            List<String> airlineCond = new ArrayList<>(List.of("fid=" + fid, "position=" + position));
            List<String> airlineInfo = airlineDB.find(airlineCond);
            String[] airlineParts = airlineInfo.getFirst().split(",");
            int aid = Integer.parseInt(airlineParts[0]);
            String time = airlineParts[2];
            int remain = Integer.parseInt(airlineParts[4]);
            if (remain <= 0) return false;

            // 创建订单
            List<String> orderParams = new ArrayList<>();
            orderParams.add(uid + "");
            orderParams.add(aid + "");
            orderParams.add(((int) (random() * 1000 + 800)) + ""); // 随机支付金额
            if (!orderDB.add(orderParams)) return false;

            // 获取新生成的oid（核心修改）
            List<String> oidQuery = new ArrayList<>();
            oidQuery.add("uid=" + uid);
            oidQuery.add("aid=" + aid);
            oidQuery.add("orderBy=ORDER BY oid DESC LIMIT 1"); // 获取最新订单
            List<String> newOrder = orderDB.find(oidQuery);
            String[] orderParts = newOrder.getFirst().split(",");
            String oid = orderParts[0]; // oid在结果集首位

            // 创建机票
            List<String> ticketParams = new ArrayList<>();
            ticketParams.add(oid);
            ticketParams.add("" + uid);
            ticketParams.add(String.valueOf((char)((int) (random() * 26 + 64))) + (int) (random() * 7 + 1));
            boolean ticketSuccess = ticketDB.add(ticketParams);

            // 更新余票
            List<String> updateParams = new ArrayList<>();
            String[] timeParts = time.split("-");
            updateParams.add("" + aid);
            updateParams.add(fid);
            updateParams.add(timeParts[0]);
            updateParams.add(timeParts[1]);
            updateParams.add(timeParts[2]);
            updateParams.add(position);
            updateParams.add("" + (remain-1));

            boolean updateSuccess = airlineDB.update(updateParams);

            return ticketSuccess && updateSuccess;
        } catch (Exception e) {
            System.err.println("出现异常：" + e.getMessage());
            return false;
        }
    }

    /**
     * @param input 输入
     * @return 返回
     */
    public boolean TicketCollection(List<String> input) { //取票（仅数据检查）
        if (input == null || input.size() < 4) {
            System.err.println("输入数据不完整，取票需要至少 4 个参数");
            return false;
        }
        if (checkUser()) return false;  // 检查用户登录状态
        return true;  // 数据检查通过，实际处理由Admin完成
    }

    /**
     * 改签（仅数据检查，核心逻辑迁移至Admin.processChange）
     * @param input 输入参数格式为 [orderId, newFid, newPosition]
     * @return 数据检查是否通过
     */
    public boolean Change(List<String> input) {
        if (input == null || input.size() < 3) {
            System.err.println("输入数据不完整，改签需要至少 3 个参数");
            return false;
        }
        if (checkUser()) return false;  // 检查用户登录状态
        return true;  // 数据检查通过，实际处理由Admin完成
    }

    /**
     * 退票（仅数据检查，核心逻辑迁移至Admin.processRefund）
     * @param input 输入参数格式为 [orderId]
     * @return 数据检查是否通过
     */
    public boolean Refund(List<String> input) {
        if (input == null || input.isEmpty()) {
            System.err.println("输入数据不能为空，退票需要订单ID");
            return false;
        }
        if (checkUser()) return false;  // 检查用户登录状态
        return true;  // 数据检查通过，实际处理由Admin完成
    }

    /**
     * @param input 输入
     * @return 返回
     */
    public boolean Registration(List<String> input) { //注册
        if (input == null || input.size() != 5) {
            System.err.println("输入数据不完整，注册需要5个参数");
            return false;
        }
        // 仅做数据检查
        return true;
    }
}